﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using Ferreteria.Clases;

namespace Ferreteria.Forms.Informes
{
    public partial class FrmArtMasVendidos : Form
    {
         DisancoEntities context;
         DataTable dtLnVentas;
         DataTable DataTable2;
         PictureBox logo;
         string Filtro;

        public FrmArtMasVendidos()
        {
            InitializeComponent();
            cmbRubro.Enabled = false;
            cmbCategorias.Enabled = false;
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            cmbRubro.DataSource = context.Rubros;
            cmbRubro.ValueMember = "rubro_id";
            cmbRubro.DisplayMember = "rubro_nombre";
            //cmbRubro.SelectedIndex = 0;
            dtimepDesde.Checked = !dtimepDesde.Checked;
            dtimepFeHasta.Checked = !dtimepFeHasta.Checked;
            logo = new PictureBox();
            logo.Image = Logo.Image;
            context = null;
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnGenerar_Click(object sender, EventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            
            dtLnVentas = new DataTable();
            dtLnVentas.Columns.Add("id");
            dtLnVentas.Columns.Add("Articulo");
            dtLnVentas.Columns.Add("Cantidad");
            dtLnVentas.Rows.Clear();

            TimeSpan unDia = new TimeSpan(1, 0, 0, 0);
            DateTime FechaVtaDesde = dtimepDesde.Value.Date;
            DateTime FechaVtaHasta = dtimepFeHasta.Value.Date + unDia;
           
            // Por defecto busco todas las lineas de venta del periodo de fechas q corresponde
            var LnVentasQuery = from lnventas in context.LineaVenta
                                where lnventas.Ventas.venta_fecha >= FechaVtaDesde
                                where lnventas.Ventas.venta_fecha <= FechaVtaHasta
                                where lnventas.Ventas.venta_estado == Estado.Emitida
                                select lnventas;

            Filtro = "Filtrado por: Todos los Rubros y Categorias de Articulos";
                       
            //Si  esta marcada el Rubro busco por Rubro
            if (chkRubro.Checked)
                {
                    if (chkCateg.Checked)//Si  esta marcada busco por Categoria
                    {
                        int CategID = Convert.ToInt32(cmbCategorias.SelectedValue.ToString());
                        int RubroID = Convert.ToInt32(cmbRubro.SelectedValue.ToString());

                        LnVentasQuery = from lnventas in context.LineaVenta
                                            where lnventas.Ventas.venta_fecha >= FechaVtaDesde
                                            where lnventas.Ventas.venta_fecha <= FechaVtaHasta
                                            where lnventas.Articulos.Categorias.categ_id == CategID
                                            where lnventas.Articulos.Categorias.Rubros.rubro_id == RubroID
                                        where lnventas.Ventas.venta_estado == Estado.Emitida
                                            select lnventas;

                        Filtro = "Filtrado por: Articulos del Rubro " + cmbRubro.Text + " y Categoria " + cmbCategorias.Text;
                    }
                    else // Busco solo por Rubro
                    {
                        int RubroID = Convert.ToInt32(cmbRubro.SelectedValue.ToString());

                        LnVentasQuery = from lnventas in context.LineaVenta
                                            where lnventas.Ventas.venta_fecha >= FechaVtaDesde
                                            where lnventas.Ventas.venta_fecha <= FechaVtaHasta
                                            where lnventas.Articulos.Categorias.rubro_id == RubroID
                                        where lnventas.Ventas.venta_estado == Estado.Emitida
                                            select lnventas;
                        Filtro = "Filtrado por: Articulos del Rubro " + cmbRubro.Text;
                    }
                }
               
                try
                {    
                
                foreach (var lnventa in LnVentasQuery)
                {
                    bool bandera = true;
                    foreach (DataRow fila in dtLnVentas.Rows) // Si el articulo esta en el datatable acumulo las unidades vendidas
                    {
                        if (dtLnVentas.Rows.Count > 0)
                        {
                            int idfila = Convert.ToInt32(fila["id"].ToString());

                            if (lnventa.art_id == idfila)
                            {
                                fila["Cantidad"] = (Convert.ToInt32(fila["Cantidad"].ToString()) + lnventa.cantidad_venta);
                                bandera = false;
                            }
                        }
                    }

                    if (bandera == true) // Si el articulo no esta en el datatable lo agrego
                    {
                        DataRow filalnVentas = dtLnVentas.NewRow();
                        filalnVentas["id"] = lnventa.art_id;
                        filalnVentas["Articulo"] = lnventa.Articulos.art_nombre;
                        filalnVentas["Cantidad"] = lnventa.cantidad_venta;
                        dtLnVentas.Rows.Add(filalnVentas);
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            dtLnVentas.DefaultView.Sort = ("Cantidad DESC");
            DataTable2 = dtLnVentas.DefaultView.ToTable();
            
            context = null;
            Imprimir();
            this.Close();
        }
             
         
        private void Imprimir()
        {
            short copias = 1;
            //ConfigurarHoja();
            //PDMasVendidos.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";
            PDMasVendidos.PrinterSettings.Copies = copias;
            printDialogMasVendidos.Document = PDMasVendidos;
            DialogResult resultado = printDialogMasVendidos.ShowDialog();
            if (resultado == DialogResult.OK)
            {
                PDMasVendidos.PrinterSettings = printDialogMasVendidos.PrinterSettings;
                printPrewDiag.Document = PDMasVendidos;
                ((Form)printPrewDiag).WindowState = FormWindowState.Maximized;  
                printPrewDiag.ShowDialog();
                
            }
        }

        private void ConfigurarHoja()
        {
           //Resolucion de la Impresora
            //PrinterResolution print = new PrinterResolution();
            //print.X =

            //PDMasVendidos.PrinterSettings.DefaultPageSettings // configurar pagina
            //PDMasVendidos.PrinterSettings.PrinterName; // nombre impresora
            //PDMasVendidos.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";
      //      PDMasVendidos.DefaultPageSettings.PaperSize;
      //  Dim Ancho As Short
      //  Dim Alto As Short
      //  Try
      //      Ancho = Short.Parse(txtAncho.Text)
      //      Alto = Short.Parse(txtAlto.Text)
      //      TamañoPersonal = New Printing.PaperSize(txtNombre.Text, Ancho, Alto)
 
      ////' Asignamos la impresora seleccionada
      ////      prdoDocumento.PrinterSettings = ImpresoraActual
      //' Asignamos el tamaño personalizado de papel
      //      prdoDocumento.DefaultPageSettings.PaperSize = TamañoPersonal
      //      MessageBox.Show("Nuevo tamaño asignado a documento")
      //      Catch ex As Exception
      //      MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK)
      //  End Try

        }

        private Font printFont = new Font("Calibri", 12);
        private Font printFontTitulo = new Font("Calibri", 16, FontStyle.Bold);
        private Font printFontsubTitulo = new Font("Calibri", 13,FontStyle.Italic );

        int countArticulos = 0;

        private void PDMasVendidos_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            string fecha = DateTime.Now.ToString("dd/MM/yyyy");
            int margenX = 50;
            int margenY = 50;
            int anchoHoja = 800;
            
            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            e.Graphics.DrawImage(logo.Image,10, 20);
            e.Graphics.DrawString("Reporte de Productos Vendidos", printFontTitulo, Brushes.Black, punto, formato);
            
            e.Graphics.DrawString("Periodo", printFontTitulo, Brushes.Black,180,130, formato);
            
            e.Graphics.DrawString("Desde:", printFontTitulo, Brushes.Black, 340,130, formato);
            string fechadesde = dtimepDesde.Value.ToString("dd/MM/yyyy");
            string fechahasta = dtimepFeHasta.Value.ToString("dd/MM/yyyy");
            e.Graphics.DrawString(fechadesde, printFont, Brushes.Black, 415, 135, formato);
            e.Graphics.DrawString("Hasta:", printFontTitulo, Brushes.Black, 580,130, formato);
            e.Graphics.DrawString(fechahasta, printFont, Brushes.Black, 655, 135, formato);

            punto.Y += 80;
            punto.X = anchoHoja / 3;
            e.Graphics.DrawString(Filtro, printFontsubTitulo, Brushes.Black, punto, formato);

            //Proceso de dibujado de las lineas 
            
            int posY = 220;
            int anchoLinea = 25;
            int posArticulo = margenX;
            int posCantidad = posArticulo + 450;
            
                       
            e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);
            e.Graphics.DrawString(fecha, printFont, Brushes.Black,645, 70);
            e.Graphics.DrawLine(Pens.Black, 10, 180, 800, 180);

            String Cod = "Codigo Art.";
            e.Graphics.DrawString(Cod, printFont, Brushes.Black, 80, 195);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFont, Brushes.Black, 380, 195);
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFont, Brushes.Black, 650, 195);
            e.Graphics.DrawLine(Pens.Black, 10, 215, 800, 215);

            int countLineas = 0;
            int maxLineas = 35;
            
            int maxArticulos = DataTable2.Rows.Count;

            while (countLineas < maxLineas && countArticulos < maxArticulos)
            {
                DataRow fila = DataTable2.Rows[countArticulos];

                
                e.Graphics.DrawString(fila["Articulo"].ToString(), printFont, Brushes.Black, 150, posY);
                e.Graphics.DrawString(fila["Cantidad"].ToString(), printFont, Brushes.Black, 670, posY);

                countArticulos++;
                countLineas++;
                posY = posY + anchoLinea;
            }

            if (countArticulos == maxArticulos)
                e.HasMorePages = false;
            else
                e.HasMorePages = true;

            //foreach (DataRow fila in DataTable2.Rows)
            //{
            //    e.Graphics.DrawString(fila["Articulo"].ToString(), printFont, Brushes.Black, 250, posY);
            //    e.Graphics.DrawString(fila["Cantidad"].ToString(), printFont, Brushes.Black, 670, posY);
            //    posY += anchoLinea;
            //}
            context = null;
        }
     
        private void cmbRubro_SelectedValueChanged(object sender, EventArgs e)
        {
            cmbCategorias.DataSource = ((Rubros)cmbRubro.SelectedItem).Categorias;
            cmbCategorias.ValueMember = "categ_id";
            cmbCategorias.DisplayMember = "categ_nombre";
        }

        private void chkRubro_CheckedChanged(object sender, EventArgs e)
        {
            if (chkRubro.Checked)
            {
                cmbRubro.Enabled = true;
            }
            else if (!chkRubro.Checked)
            {
                cmbRubro.Enabled = false;
            }
        }

        private void chkCateg_CheckedChanged(object sender, EventArgs e)
        {
            if (chkCateg.Checked)
            {
                cmbCategorias.Enabled = true;
            }
            else if (!chkCateg.Checked)
            {
                cmbCategorias.Enabled = false;
            }
        }
    }
}
